package com.example.demo.controller;

import com.example.demo.service.AsyncService;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;


//关于同步，异步问题的探讨
// http://localhost:8080/test
@RestController
public class AsyncController {
//    @Autowired
//    @Resource

    @Autowired
    public AsyncService service;


    @GetMapping("/test")
    public void test(){
        System.out.println("获取主线程名称："+Thread.currentThread().getName());


        //传统方法
        service.serviceTest();



        /**
         *  这里也可以采用以下方式使用，但是使用线程池的方式可以很便捷的对线程管理（提高程序的整体性能），
         *  也可以减少每次执行该请求时都需要创建一个线程造成的性能消耗
         *  new Thread(() ->{
         *  run方法中的业务逻辑
         *  })
         */

        /**
         * 定义一个线程池
         * 核心线程数（corePoolSize）:1
         * 最大线程数（maximumPoolSize）: 1
         * 保持连接时间（keepAliveTime）：50000
         * 时间单位 (TimeUnit):TimeUnit.MILLISECONDS(毫秒)
         * 阻塞队列 new LinkedBlockingQueue<Runnable>()
         */
//        ThreadPoolExecutor executor = new ThreadPoolExecutor(1,5,50000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
//        // 执行业务逻辑方法serviceTest()
//        executor.execute(new Runnable() {
//            @Override
//            public void run() {
//                service.serviceTest();
//            }
//        });


        System.out.println("执行完成，向用户响应成功信息");




    }

}
